package org.btik.light.meta;

import org.btik.light.meta.base.Report;
import org.btik.light.meta.base.Command;


/**
 * @author lustre
 * @version 1.0
 * @since 2021/5/15 12:37
 * 设备在消息命令和命令层面，对应用层的抽象。
 */
public interface Dev {
    /**
     * 超时时间
     *
     * @return 命令默认超时时间
     */
    long getTimeOut();

    /**
     * 服务端主动断链设备
     */
    default void disConnect() {

    }

    /***
     * 服务端主动连接设备
     * */
    default void connect() {

    }

    /***
     *
     * 异步发送消息
     * @param msg 异步命令 id为0
     * */
    void sendCmdOrMsg(Command msg);

    /**
     * 按默认超时时间发送同步命令
     *
     * @param cmd 同步命令，会生成唯一id
     * @return 同步返回报文
     */
    default Report sendSyncCmd(Command cmd) {
        return sendSyncCmd(cmd, getTimeOut());
    }

    /**
     * 发送同步命名
     *
     * @param timeout 当前命令超时时间
     * @param cmd     同步命令，会生成唯一id
     * @return 同步返回报文
     */
    Report sendSyncCmd(Command cmd, long timeout);

    String CMD_ID = "cmdId";

    boolean isOnline();
}
